import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
import Layout from '@/layout'
import { constantRoutes } from '@/router'
import NotFound from '@/views/404.vue'
NProgress.configure({ showSpinner: false }) // NProgress Configuration

const _import = require('./router/_import_' + process.env.NODE_ENV)
const whiteList = ['/login'] // no redirect whitelist

router.beforeEach(async(to, from, next) => {
    // start progress bar
    NProgress.start()

    // set page title
    document.title = getPageTitle(to.meta.title)

    // determine whether the user has logged in
    const hasToken = getToken()
    console.log(hasToken)

    if (hasToken) {
        if (to.path === '/login') {
            // if is logged in, redirect to the home page
            next({ path: '/' })
            NProgress.done()
        } else {
            const hasGetUserInfo = store.getters.nickname
            if (hasGetUserInfo) {
                next()
            } else {
                try {
                    // get user info
                    await store.dispatch('user/getInfo')
                    if (store.getters.menus.length < 1) {
                        // global.antRouter=[]
                        next()
                    }
                    let newMenus = []
                    const menus = filterAsyncRouter(store.getters.menus)
                        // router.addRoutes(menus)
                        // global.antRouter=menus
                    menus.map(item => {
                        let newChild = []
                        item.children.map(subitem => {
                            subitem = {...subitem, meta: { title: `${subitem.meta.name}`, icon: 'example' } },
                                newChild.push(subitem)
                        })
                        item = {...item, meta: { title: `${item.label}`, icon: 'list' }, alwaysShow: true, children: newChild, component: Layout }
                        newMenus.push(item)
                    })
                    newMenus.push({ path: '/404', component: NotFound, hidden: true }, {
                        path: '*',
                        redirect: '/404',
                        hidden: true
                    })
                    let allRoute = constantRoutes.concat(newMenus)
                    router.options.routes = allRoute
                    router.addRoutes(newMenus)
                    next({...to, replace: true })
                } catch (error) {
                    // remove token and go to login page to re-login
                    await store.dispatch('user/resetToken')
                    console.log('aa', error)
                    Message.error(error.message || 'Has Error')
                    next(`/login?redirect=${to.path}`)
                    NProgress.done()
                }
            }
        }
    } else {
        /* has no token*/

        if (whiteList.indexOf(to.path) !== -1) {
            // in the free login whitelist, go directly
            next()
        } else {
            // other pages that do not have permission to access are redirected to the login page.
            next(`/login?redirect=${to.path}`)
            NProgress.done()
        }
    }
})

function filterAsyncRouter(asyncRouterMap) {
    const accessedRouters = asyncRouterMap.filter(route => {
        if (route.component) {
            if (route.component === 'Layout') { // Layout组件特殊处理
                route.component = Layout
            } else {
                route.component = _import(route.component) // 导入组件
            }
        }
        if (route.children && route.children.length) {
            route.children = filterAsyncRouter(route.children)
        }
        return true
    })
    return accessedRouters
}


router.afterEach(() => {
    // finish progress bar
    NProgress.done()
})

///////////////////////////////////////////////////////



// import router from './router'
// import store from './store'
// import { Message } from 'element-ui'
// import NProgress from 'nprogress' // progress bar
// import 'nprogress/nprogress.css' // progress bar style
// import { getToken } from '@/utils/auth' // get token from cookie
// import getPageTitle from '@/utils/get-page-title'
// import {constantRoutes } from '@/router'

// import Layout from '@/layout' // 引入Layout
// import NotFound from '@/views/404.vue'
// const _import = require('./router/_import_' + process.env.NODE_ENV) // 引入获取组件的方法

// NProgress.configure({ showSpinner: false }) // NProgress Configuration

// const whiteList = ['/login'] // no redirect whitelist


// router.beforeEach(async (to, from, next) => {

//   // start progress bar
//   NProgress.start()

//   // set page title
//   document.title = getPageTitle(to.meta.title)

//   // determine whether the user has logged in
//   const hasToken = getToken()

//   if (hasToken) {
//     if (to.path === '/login') {
//       // if is logged in, redirect to the home page
//       next({ path: '/' })
//       NProgress.done()
//     } else {
//       const hasGetUserInfo = store.getters.nickname
//       if (hasGetUserInfo) {
//         next()
//       } else {
//         try {
//           // get user info
//           await store.dispatch('user/getInfo')
//           // 动态路由
//           if (store.getters.menus.length < 1) {
//             // global.antRouter = []
//             next()
//           }
//           let newMenus = []
//           let menus = filterAsyncRouter(store.getters.menus) //过滤路由
//           menus.map(item => {
//             let newChild = []
//             item.children.map(subitem => {
//               subitem = { ...subitem, meta: { title: `${subitem.meta.name}` } },
//                 newChild.push(subitem)
//             })
//             item = { ...item, meta: { title: `${item.label}` }, alwaysShow: true, children: newChild, component: Layout }
//             newMenus.push(item)
//           })
//           newMenus.push({ path: '/404', component: NotFound, hidden: true }, {
//             path: '*',
//             redirect: '/404',
//             hidden: true
//           })
//           let allRoute = constantRoutes.concat(newMenus)
//           router.options.routes = allRoute
//           router.addRoutes(newMenus) //动态添加路由

//           // global.antRouter = menus // 将路由数据传递给全局变量，做侧边栏菜单渲染工作
//           next({ ...to, replace: true })
//         } catch (error) {
//           // remove token and go to login page to re-login
//           await store.dispatch('user/resetToken')
//           Message.error(error.message || 'Has Error')
//           next(`/login?redirect=${to.path}`)
//           NProgress.done()
//         }
//       }
//     }
//   } else {
//     /* has no token*/

//     if (whiteList.indexOf(to.path) !== -1) {
//       // in the free login whitelist, go directly
//       next()
//     } else {
//       // other pages that do not have permission to access are redirected to the login page.
//       next(`/login?redirect=${to.path}`)
//       NProgress.done()
//     }
//   }
// })

// // 遍历后台传来的路由字符串，转换为组件对象
// function filterAsyncRouter(asyncRouterMap) {
//   const accessedRouters = asyncRouterMap.filter(route => {
//     if (route.component) {
//       if (route.component === 'Layout') { // Layout组件特殊处理
//         route.component = Layout
//       } else {
//         route.component = _import(route.component) // 导入组件
//       }
//     }
//     if (route.children && route.children.length) {
//       route.children = filterAsyncRouter(route.children)
//     }
//     return true
//   })
//   return accessedRouters
// }

// router.afterEach(() => {
//   // finish progress bar
//   NProgress.done()
// })